<?php
/**
 * Модель region
 * 
 * Класс модели
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Модель region
 *
 */
class ModelRegion extends Model {
	
	const TABLE				= 'region';
	const F_REGION_ID  	= 'region_id';
	const F_PARENT_ID  	= 'parent_id';
	const F_LEVEL  	= 'level';
	const F_TITLE  	= 'title';
			
	public function __construct($className=null){
		parent::__construct(__CLASS__);
		$this->name='region';
		$this->id_field=array(self::F_REGION_ID);
		$this->fields=array(
		self::TABLE.DOT.self::F_REGION_ID=> new Field($this,self::F_REGION_ID,self::TABLE,array(
				'auto'=>true,
				'important'=>true,
				'lenght'=>5)),
		self::TABLE.DOT.self::F_PARENT_ID=> new Field($this,self::F_PARENT_ID,self::TABLE,array(
				'lenght'=>5,
				'join_table'=>'parent')),
		self::TABLE.DOT.self::F_LEVEL=> new Field($this,self::F_LEVEL,self::TABLE,array(
				'lenght'=>1,
				'validate_type'=>Validator::VALIDATE_INT)),
		self::TABLE.DOT.self::F_TITLE=> new Field($this,self::F_TITLE,self::TABLE,array(
				'lenght'=>50,
				'type'=>Field::TYPE_STRING))		);
	}
	//переопределяем save для того чтоб подставлять коректную величину уровня
	public function save($data,$id=false){
	    //если уровень не передан
	    if(!isset($data[self::F_LEVEL]) && isset($data[self::F_PARENT_ID])){
	       //если это не корневой элемент
	       if($data[self::F_PARENT_ID]){
	           //смотрим уровень родителя и прибавляем к нему 1
	           $data[self::F_LEVEL]=$this->loadOne($data[self::F_PARENT_ID],self::F_LEVEL)+1;
	       }else{
	           $data[self::F_LEVEL]=0;
	       }
	    }
	    if(is_numeric($id) && isset($data[self::F_PARENT_ID]) && ($id == $data[self::F_PARENT_ID] || !$this->checkParent($data[self::F_PARENT_ID],$id))){
	       return array(self::TABLE.DOT.self::F_PARENT_ID=>'Замыкание');
	    }
	    return parent::save($data,$id);
	}
	/**
	 * рекурсивная проверка замыкания дерева
	 *
	 * @param int $parent_id
	 * @param int $id
	 * @return boolean
	 */
	public function checkParent($parent_id, $id){
	    if(!$parent_id)return true;
	    if($parent_id==$id)return false;
	    $item=$this->loadOne($parent_id,array(self::F_REGION_ID,self::F_PARENT_ID));
	    return $this->checkParent($item[self::F_PARENT_ID],$id);
	}
}
